home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / impl / slist.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-05  |  4.0 KB  |  164 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  slist.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_IMPL_SLIST_H
  16. #define LEDA_IMPL_SLIST_H
  17.  
  18. //------------------------------------------------------------------------------
  19. // simply linked lists
  20. //------------------------------------------------------------------------------
  21.  
  22.  
  23. #include <LEDA/basic.h>
  24.  
  25.  
  26. class SLIST; 
  27. class slink;
  28.  
  29. typedef slink* slist_item;
  30.  
  31. //------------------------------------------------------------------------------
  32. // class slink 
  33. //------------------------------------------------------------------------------
  34.  
  35. class slink {
  36.  
  37.   friend class SLIST;
  38.  
  39.   slink* succ;
  40.   GenPtr e;
  41.  
  42.   slink(GenPtr a, slink* suc) { e = a; succ = suc; }
  43.  
  44.   LEDA_MEMORY(slink)
  45.  
  46. };
  47.  
  48.  
  49. //------------------------------------------------------------------------------
  50. // SLIST: base class for all simply linked Lists
  51. //------------------------------------------------------------------------------
  52.  
  53. class SLIST {
  54.  
  55.    slink* h;                     //head
  56.    slink* t;                     //tail
  57.    slink* iterator;              //iterator;
  58.    int    count;                 //length of List
  59.  
  60. virtual void clear_el(GenPtr&) const {}
  61. virtual void copy_el(GenPtr&)  const {}
  62. virtual int  int_type() const { return 0; }
  63.  
  64. public:
  65.  
  66.    int space()  const { return sizeof(SLIST) + count * sizeof(slink); }
  67.    int length() const { return count; }
  68.    int empty()  const { return (count==0);}
  69.  
  70.    slink* insert(GenPtr, slink*);
  71.  
  72.  
  73.    slink* push(GenPtr a)   
  74.    { count++;
  75.      h = new slink(a,h); 
  76.      if (t==0) t = h;
  77.      return h;
  78.    }
  79.  
  80.    slink* append(GenPtr a)
  81.    { count++;
  82.      if (t) t = t->succ = new slink(a,0); 
  83.      else   t = h = new slink(a,0); 
  84.      return t;
  85.    } 
  86.  
  87.    slink* first()               const { return h; }
  88.    slink* first_item()          const { return h; }
  89.    slink* last()                const { return t; }
  90.    slink* last_item()           const { return t; }
  91.    slink* next_item(slink* p)   const { return p->succ; }
  92.    slink* succ(slink* l)        const { return l->succ; }
  93.    slink* cyclic_succ(slink*)   const;
  94.  
  95.  
  96. // iteration
  97.  
  98.    void   set_iterator(slink* p)   const { (slink*&)iterator = p; }
  99.    void   start_iteration()        const { set_iterator(h); }
  100.    void   move_to_succ()           const { set_iterator(iterator->succ); }
  101.    slink* read_iterator(GenPtr& x) const { if (iterator) x = iterator->e; 
  102.                                            return iterator; }
  103.  
  104.    GenPtr loop_to_succ(GenPtr& x) const { return x = slist_item(x)->succ; }
  105.  
  106. // old iteration stuff
  107.  
  108.    slink* get_iterator()  const { return iterator; }
  109.    void init_iterator()  const { set_iterator(0); }
  110.  
  111.    slink* move_iterator() const  
  112.    { set_iterator( iterator ? iterator->succ : h);
  113.      return iterator;
  114.    } 
  115.  
  116.    void conc(SLIST&);
  117.  
  118.    GenPtr head()   const { return h ? h->e : 0;}
  119.    GenPtr tail()   const { return t ? t->e : 0;}
  120.    GenPtr pop();
  121.  
  122.    void del_succ(slink* p)    
  123.    { slink* q = p->succ;
  124.      if (q == t) t = p;
  125.      p->succ = q->succ; 
  126.      delete q;
  127.      count--;
  128.    }
  129.  
  130.    bool current_element(GenPtr& x)  const
  131.    { if (!iterator) return false;
  132.      else { x = iterator->e;
  133.             return true; }
  134.     }
  135.  
  136.    bool next_element(GenPtr& x) const 
  137.   { move_iterator(); 
  138.     return current_element(x); 
  139.    }
  140.  
  141.    GenPtr  contents(slink* l)  const  { return l->e; }
  142.    GenPtr& entry(slink* l)            { return l->e; }
  143.    GenPtr& operator[](slink* l)       { return l->e; }
  144.    GenPtr  operator[](slink* l) const { return l->e; }
  145.  
  146.    void clear();
  147.  
  148.    SLIST();    
  149.    SLIST(GenPtr a);
  150.    SLIST& operator=(const SLIST&); 
  151.    SLIST(const SLIST&);
  152.    virtual ~SLIST()     { clear(); }
  153. };
  154.  
  155.  
  156. // dummy I/O and cmp functions
  157.  
  158. inline void Print(const SLIST&,ostream&) { }
  159. inline void Read(SLIST&, istream&) { }
  160. inline int  compare(const SLIST&,const SLIST&) { return 0; }
  161.  
  162. #endif
  163.